item13、14、15、16、17:资源管理

当通过指针保存一个对象资源时,就需要留意其释放,但很多情况资源可能不能按照预期被释放:提前return、异常等情况。

为了确保资源总是能够在结束使用时被释放,可以通过对象管理资源,通过析构函数自动执行的机制保证资源能够被释放。

RAII:资源获取即初始化。

RAII对象:在构造函数中获得资源,在析构函数中释放资源,如智能指针share_ptr、unique_ptr。

资源管理类的拷贝行为:

  • 禁止复制
  • 引用计数拷贝
  • 复制底层资源
  • 资源管理权转移
int priority();
class A{};
class B{};
void doFun(A(new B), priority());

这个代码的执行顺序是:

  1. new B先于A的构造函数和priority函数之前
  2. A的构造函数和priority函数的执行顺序不定

这样会导致一个问题,new B执行了,但priority()执行出错,导致资源没有传给对象A,从而也无法正常释放。

正确的做法是将语句分离开来:

share_ptr<B> ptr(new B);
doFun(ptr, priority());

这样执行顺序就固定了